package com.jml.jdk8.stream;


import java.util.Arrays;
import java.util.List;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import org.junit.Test;

/**
 * @author:jml
 * @date: 2020/2/25 0025 16:44
 * @description：
 */
public class Stream源码 {

    @Test
    public void peeks(){
        List<String> collect = Stream.of("one", "two", "three", "four")
                .filter(e -> e.length() > 3)
                .peek(e -> System.out.println("Filtered value: " + e))
                .map(String::toUpperCase)
                 .peek(e -> System.out.println("Mapped value: " + e))
                .collect(Collectors.toList());
        System.out.println(collect);
    }

    /**
     * 这里不会执行onClose中的方法
     */
    @Test
    public void onClose1(){
        List<String> list = Arrays.asList("one", "two", "three", "four");
        //onClose方法只有在Stream的Close方法执行的时候才执行
        list.stream().onClose(()->{
            System.out.println("aaa");
        }).onClose(() ->{
            System.out.println("bbb");
        }).forEach(System.out::println);
    }

    /**
     * onClose方法只有在Stream的Close方法执行的时候才执行
     * 即使其中一个onClose方法抛异常，也不会影响其他的onClose方法的执行，互相独立不依赖
     *任何一个close关闭处理器出现异常，第一个异常会传递给调用者，其他的异常会被压制，
     *      在第一个异常之后会有Suppressed:其他的异常
     */
    @Test
    public void onClose2(){
        List<String> list = Arrays.asList("one", "two", "three", "four");
        try (Stream<String> stream = list.stream();){
            stream.onClose(()->{
                System.out.println("aaa");
                throw new NullPointerException("zzz");
            }).onClose(() ->{
                System.out.println("bbb");
                throw new ArithmeticException("zxzxz");
            }).forEach(System.out::println);
        }
    }

    /**
     * 假如把异常单独定义出来，抛的同一个实例异常，就看不到被压制的异常，不可能自己压制自己
     */
    @Test
    public void onClose3(){
        List<String> list = Arrays.asList("one", "two", "three", "four");
        NullPointerException nullPointerException = new NullPointerException("z1z1");
        try (Stream<String> stream = list.stream();){
            stream.onClose(()->{
                System.out.println("aaa");
                throw nullPointerException;
            }).onClose(() ->{
                System.out.println("bbb");
                throw nullPointerException;
            }).forEach(System.out::println);
        }
    }

    /**
     * 抛的不是同一个实例异常即使是同类型的异常，还是可以看到第二个异常被压制
     */
    @Test
    public void onClose4(){
        List<String> list = Arrays.asList("one", "two", "three", "four");
        try (Stream<String> stream = list.stream();){
            stream.onClose(()->{
                System.out.println("aaa");
                throw new NullPointerException("z1z1");
            }).onClose(() ->{
                System.out.println("bbb");
                throw new NullPointerException("再再");
            }).forEach(System.out::println);
        }
    }

    /**
     *分割迭代器源码剖析
     * list.stream()是Collection中的默认方法，是集合的父接口
     */
    @Test
    public void tt(){
        List<String> list = Arrays.asList("one", "two", "three", "four");
        list.stream().forEach(System.out::println);
    }






















}
